package com.zpark.springboottest.controller;

import com.zpark.springboottest.group.Group1;
import com.zpark.springboottest.pojo.Address;
import org.apache.catalina.User;
import org.hibernate.validator.constraints.Length;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.groups.Default;
import java.util.ArrayList;
import java.util.List;

@RestController
@RequestMapping("/user")
@Validated
public class UserController {
    /*基本数据类型校验*/
    @GetMapping("/demo01")
    public String test1(@NotBlank(message = "name不能为null") @Length(min = 2, max = 17, message = "name的长度必须在 {min} - {max} 之间")String uname){
        return "success";
    }
    /*
     * . URL参数校验
     * 一般GET请求都是在URL中传入参数。对于这种情况，可以直接通过注解来指定参数的校验规则。
     * localhost:8080/user/b?name=111&age=10
     * */
    //输出在控制台
    @RequestMapping("/demo02")
    public String test2(@Length(min = 18, max =50 , message = "姓名长度错误，姓名长度在{min}-{max}之间！") String uname
                        , @Min(value = 1, message = "年龄最小只能18") @Max(value = 99, message = "年龄最大只能99") int age) {
        System.out.println(uname + "," + age);
        return uname + "," + age;
    }

    /*对象类型*/
    @RequestMapping("/demo03")
    //给 User 参数添加 ＠Validated 注解，表示需要对该参数做校验，BindingResult 参数表示在校验出错时保存的出错信息。
    public List<String> test3(@Validated @RequestBody User user, BindingResult br) {
        List<String> errors = new ArrayList<>();
        //判断参数是否异常
        //如果 BindingResult 的 hasErrors 方法返回true，则表示有错误信息
        if (br.hasErrors()) {
            //所有参数异常
            List<ObjectError> list = br.getAllErrors();
            //遍历参数异常并输出异常信息
            for (ObjectError error : list) {
                errors.add(error.getDefaultMessage());
            }
            return errors;
        }
        List<String> list = new ArrayList<>();
        list.add("success");
        return list;
    }

    @PostMapping("/demo04")
    public List<String> test4(@Validated({Group1.class, Default.class}) User user, BindingResult br) {
        List<String> errors = new ArrayList<>();
        // 如果 BindingResult 的 hasErrors 方法返回true，则表示有错误信息
        if (br.hasErrors()) {
            List<ObjectError> allErrors = br.getAllErrors();
            /// 遍历错误信息，返回给前端
            for (ObjectError error : allErrors) {
                errors.add(error.getDefaultMessage());
            }
        }
        return errors;
    }
    /*分组校验*/
    /*在部分注解中添加了 groups 属性，表示该校验规则所属的分组， 接下来在 ＠Validated 注解中指定校验分组：*/
    @PostMapping("/demo05")
    public List<String> test5(@Validated({Group1.class, Default.class}) Address address, BindingResult br) {
        List<String> errors = new ArrayList<>();
        // 如果 BindingResult 的 hasErrors 方法返回true，则表示有错误信息
        if (br.hasErrors()) {
            List<ObjectError> allErrors = br.getAllErrors();
            /// 遍历错误信息，返回给前端
            for (ObjectError error : allErrors) {
                errors.add(error.getDefaultMessage());
            }
        }
        return errors;
    }


}
